package co.gov.medellin.ssti.sub.model.dao.impl;

import java.io.UnsupportedEncodingException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.LinkedList;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.model.dao.IVerificacionDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.VerificacionVO;

public class VerificacionDAOImpl extends BaseDAOImpl implements
		IVerificacionDAO {

	private static final String VERIFICACION = "SELECT ben.tipo_documento TIPO_DOC_SUB, v.tipo_documento TIPO_DOC_VERI, ben.numero_documento DOCUMENTO, v.numero_documento DOCUMENTOVERI, "
			+ " ben.PRIMER_NOMBRE PRIMERNOMBRE, v.PRIMER_NOMBRE PRIMERNOMBREVERI, ben.SEGUNDO_NOMBRE SEGUNDONOMBRE, "
			+ " v.SEGUNDO_NOMBRE SEGUNDONOMBREVERI, ben.PRIMER_APELLIDO PRIMERAPELLIDO, v.PRIMER_APELLIDO PRIMERAPELLIDOVERI, "
			+ " ben.SEGUNDO_APELLIDO SEGUNDOAPELLIDO, v.SEGUNDO_APELLIDO SEGUNDOAPELLIDOVERI, ben.sexo SEXO,a.nombre DEPENDENCIA, "
			+ " p.NOMBRE PROGRAMA, sp.NOMBRE BENEFICIO, bot.VALOR_BENEFICIO VALOR, to_char(bot.FECHA_BENEFICIO, 'yyyy-mm-dd') FECHABENE, "
			+ " ben.FICHA_SISBEN FICHASISBEN, ben.HOGAR_SISBEN HOGARSISBEN, ben.PUNTAJE_SISBEN PUNTAJESISBEN, ben.NIVEL_SISBEN NIVELSISBEN, to_char(ben.FE_ENCUESTA_SISBEN, 'yyyy-mm-dd') FECHAENCUESTA, "
			+ " (SELECT nombre FROM PAOYER.tcs_valor_flexible WHERE codigo = ben.vfl_codigo_comuna) AS COMUNA, "
			+ " (SELECT nombre FROM PAOYER.tcs_valor_flexible WHERE codigo = ben.vfl_codigo_barrio) AS BARRIO, "
			+ " ben.direccion_descriptiva AS DIRECCION, "
			+ " ben.telefono AS TELEFONO, "
			+ " ben.fecha_nacimiento AS FECHANACIMIENTO "
			+ " FROM tcs_ben_beneficiario ben, tcs_ben_sub_verificacion v, tcs_ben_beneficio_otorgado bot, "
			+ " TCS_BEN_SUBPROGRAMA sp, TCS_BEN_PROGRAMA p, tcs_ben_area a "
			+ " WHERE ben.numero_documento = v.numero_documento "
			+ " AND ben.CODIGO = bot.BEN_CODIGO "
			+ " AND bot.SBPR_CODIGO = sp.CODIGO "
			+ " AND sp.PRG_CODIGO = p.CODIGO "
			+ " AND p.AREA_CODIGO = a.CODIGO " + " AND v.USUARIO_CREA = ? ";

	private static final String P_POBLA_DATOS_DE_CLOB_VERI = "{call beneficios.p_pobla_datos_de_clob_veri(?, ?)}";

	private static final String DELETE_FROM_TCS_BEN_SUB_VERIFICACION_BY_USUARIO_CREA = "DELETE FROM TCS_BEN_SUB_VERIFICACION "
			+ " WHERE USUARIO_CREA = ? ";

	public VerificacionDAOImpl(Connection con) {
		super(con);
	}

	public void uploadFile(byte[] fileData, String nomUser)
			throws DAOException, UnsupportedEncodingException {
		CallableStatement cs = null;
		ResultSet rst = null;
		String strData = new String(fileData, "ISO-8859-1");
		try {
			cs = conn.prepareCall(P_POBLA_DATOS_DE_CLOB_VERI);
			cs.setString(1, strData);
			cs.setString(2, nomUser);
			cs.execute();
		} catch (SQLException e) {
			SUBException.logDebugError("Error uploadFile: ", e);
			throw new DAOException(e);
		} finally {
			close(rst, cs);
		}
	}

	public int deleteRecordsOld(String nomUser) throws SQLException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		int rowCount = 0;
		try {
			pstmt = conn
					.prepareStatement(DELETE_FROM_TCS_BEN_SUB_VERIFICACION_BY_USUARIO_CREA);
			pstmt.setString(1, nomUser);
			rowCount = pstmt.executeUpdate();
		} catch (Exception e) {
			SUBException.logDebugError("Error deleteRecordsOld: ", e);
		} finally {
			close(rst, pstmt);
		}
		return rowCount;
	}

	public Collection<VerificacionVO> findVerification(String nomUser)
			throws SQLException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		Collection<VerificacionVO> verificados = new LinkedList<VerificacionVO>();
		try {
			pstmt = conn.prepareStatement(VERIFICACION);
			pstmt.setString(1, nomUser);
			rst = pstmt.executeQuery();
			VerificacionVO verificacionVO;
			// System.out.println(VERIFICACION);
			// System.out.println(nomUser);
			while (rst.next()) {
				verificacionVO = new VerificacionVO();
				verificacionVO.setTipoDocSub(rst.getString("TIPO_DOC_SUB"));
				verificacionVO.setTipoDocVeri(rst.getString("TIPO_DOC_VERI"));
				verificacionVO.setNumeroDocumento(rst.getString("DOCUMENTO"));
				verificacionVO.setNumeroDocumentoVeri(rst
						.getString("DOCUMENTOVERI"));
				verificacionVO.setPrimerNombre(rst.getString("PRIMERNOMBRE"));
				verificacionVO.setPrimerNombreVeri(rst
						.getString("PRIMERNOMBREVERI"));
				verificacionVO.setSegundoNombre(rst.getString("SEGUNDONOMBRE"));
				verificacionVO.setSegundoNombreVeri(rst
						.getString("SEGUNDONOMBREVERI"));
				verificacionVO.setPrimerApellido(rst
						.getString("PRIMERAPELLIDO"));
				verificacionVO.setPrimerApellidoVeri(rst
						.getString("PRIMERAPELLIDOVERI"));
				verificacionVO.setSegundoApellido(rst
						.getString("SEGUNDOAPELLIDO"));
				verificacionVO.setSegundoApellidoVeri(rst
						.getString("SEGUNDOAPELLIDOVERI"));
				verificacionVO.setSexo(rst.getString("SEXO"));
				verificacionVO.setComuna(rst.getString("COMUNA"));
				verificacionVO.setBarrio(rst.getString("BARRIO"));
				verificacionVO.setDireccion(rst.getString("DIRECCION"));
				verificacionVO.setTelefono(rst.getString("TELEFONO"));
				verificacionVO.setFechaNacimiento(rst
						.getDate("FECHANACIMIENTO"));
				verificacionVO.setDependencia(rst.getString("DEPENDENCIA"));
				verificacionVO.setPrograma(rst.getString("PROGRAMA"));
				verificacionVO.setBeneficio(rst.getString("BENEFICIO"));
				verificacionVO.setValorBeneficio(rst.getLong("VALOR"));
				verificacionVO.setFechaBeneficio(rst.getString("FECHABENE"));
				verificacionVO.setFichaSisben(rst.getString("FICHASISBEN"));
				verificacionVO.setHogarSisben(rst.getString("HOGARSISBEN"));
				verificacionVO.setPuntajeSisben(rst.getString("PUNTAJESISBEN"));
				verificacionVO.setNivelSisben(rst.getInt("NIVELSISBEN"));
				verificacionVO.setFechaSisben(rst.getString("FECHAENCUESTA"));

				verificados.add(verificacionVO);
			}
		} catch (Exception e) {
			SUBException.logDebugError("Error findVerification: ", e);
		} finally {
			close(rst, pstmt);
		}
		return verificados;
	}
}
